package com.luych.toolbox.docker.service.sdk.system.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class DockerInfoResult {

    @JsonProperty("NGoroutines")
    private Long ngoroutines;

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Swarm")
    private Swarm swarm;

    @JsonProperty("RuncCommit")
    private RuncCommit runcCommit;

    @JsonProperty("OSVersion")
    private String osVersion;

    @JsonProperty("Runtimes")
    private Runtimes runtimes;

    @JsonProperty("ID")
    private String id;

    @JsonProperty("DriverStatus")
    private String[][] driverStatus;

    @JsonProperty("BridgeNfIptables")
    private Boolean bridgeNfIptables;

    @JsonProperty("LiveRestoreEnabled")
    private Boolean liveRestoreEnabled;

    @JsonProperty("SystemTime")
    private String systemTime;

    @JsonProperty("NoProxy")
    private String noProxy;

    @JsonProperty("Architecture")
    private String architecture;

    @JsonProperty("NEventsListener")
    private Long neventsListener;

    @JsonProperty("HttpsProxy")
    private String httpsProxy;

    @JsonProperty("Images")
    private Long images;

    @JsonProperty("ContainersRunning")
    private Long containersRunning;

    @JsonProperty("Labels")
    private List<String> labels;

    @JsonProperty("InitCommit")
    private InitCommit initCommit;

    @JsonProperty("NFd")
    private Long nfd;

    @JsonProperty("KernelVersion")
    private String kernelVersion;

    @JsonProperty("LoggingDriver")
    private String loggingDriver;

    @JsonProperty("DefaultAddressPools")
    private List<DefaultAddressPool> defaultAddressPools;

    @JsonProperty("OSType")
    private String osType;

    @JsonProperty("SecurityOptions")
    private List<String> securityOptions;

    @JsonProperty("ContainerdCommit")
    private ContainerdCommit containerdCommit;

    @JsonProperty("GenericResources")
    private List<GenericResource> genericResources;

    @JsonProperty("KernelMemory")
    private Boolean kernelMemory;

    @JsonProperty("OperatingSystem")
    private String operatingSystem;

    @JsonProperty("RegistryConfig")
    private RegistryConfig registryConfig;

    @JsonProperty("ServerVersion")
    private String serverVersion;

    @JsonProperty("OomKillDisable")
    private Boolean oomKillDisable;

    @JsonProperty("CpuCfsQuota")
    private Boolean cpuCfsQuota;

    @JsonProperty("Containers")
    private Long containers;

    @JsonProperty("Driver")
    private String driver;

    @JsonProperty("IPv4Forwarding")
    private Boolean ipv4Forwarding;

    @JsonProperty("ExperimentalBuild")
    private Boolean experimentalBuild;

    @JsonProperty("ProductLicense")
    private String productLicense;

    @JsonProperty("ClusterStore")
    private String clusterStore;

    @JsonProperty("DockerRootDir")
    private String dockerRootDir;

    @JsonProperty("CPUSet")
    private Boolean cpuSet;

    @JsonProperty("CpuCfsPeriod")
    private Boolean cpuCfsPeriod;

    @JsonProperty("DefaultRuntime")
    private String defaultRuntime;

    @JsonProperty("ClusterAdvertise")
    private String clusterAdvertise;

    @JsonProperty("CPUShares")
    private Boolean cpuShares;

    @JsonProperty("Debug")
    private Boolean debug;

    @JsonProperty("NCPU")
    private Integer ncpu;

    @JsonProperty("Plugins")
    private Plugins plugins;

    @JsonProperty("SwapLimit")
    private Boolean swapLimit;

    @JsonProperty("CgroupDriver")
    private String cgroupDriver;

    @JsonProperty("ContainersPaused")
    private Long containersPaused;

    @JsonProperty("MemTotal")
    private Long memTotal;

    @JsonProperty("IndexServerAddress")
    private String indexServerAddress;

    @JsonProperty("MemoryLimit")
    private Boolean memoryLimit;

    @JsonProperty("HttpProxy")
    private String httpProxy;

    @JsonProperty("InitBinary")
    private String initBinary;

    @JsonProperty("CgroupVersion")
    private String cgroupVersion;

    @JsonProperty("PidsLimit")
    private Boolean pidsLimit;

    @JsonProperty("Isolation")
    private String isolation;

    @JsonProperty("BridgeNfIp6tables")
    private Boolean bridgeNfIp6tables;

    @JsonProperty("Warnings")
    private List<String> warnings;

    @JsonProperty("ContainersStopped")
    private Long containersStopped;

    public Long getNgoroutines() {
        return ngoroutines;
    }

    public void setNgoroutines(Long ngoroutines) {
        this.ngoroutines = ngoroutines;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Swarm getSwarm() {
        return swarm;
    }

    public void setSwarm(Swarm swarm) {
        this.swarm = swarm;
    }

    public RuncCommit getRuncCommit() {
        return runcCommit;
    }

    public void setRuncCommit(RuncCommit runcCommit) {
        this.runcCommit = runcCommit;
    }

    public String getOsVersion() {
        return osVersion;
    }

    public void setOsVersion(String osVersion) {
        this.osVersion = osVersion;
    }

    public Runtimes getRuntimes() {
        return runtimes;
    }

    public void setRuntimes(Runtimes runtimes) {
        this.runtimes = runtimes;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String[][] getDriverStatus() {
        return driverStatus;
    }

    public void setDriverStatus(String[][] driverStatus) {
        this.driverStatus = driverStatus;
    }

    public Boolean getBridgeNfIptables() {
        return bridgeNfIptables;
    }

    public void setBridgeNfIptables(Boolean bridgeNfIptables) {
        this.bridgeNfIptables = bridgeNfIptables;
    }

    public Boolean getLiveRestoreEnabled() {
        return liveRestoreEnabled;
    }

    public void setLiveRestoreEnabled(Boolean liveRestoreEnabled) {
        this.liveRestoreEnabled = liveRestoreEnabled;
    }

    public String getSystemTime() {
        return systemTime;
    }

    public Date getSystemDate() {
        if (this.systemTime == null) return null;
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(systemTime, DateTimeFormatter.ISO_DATE_TIME);
        return Date.from(zonedDateTime.toInstant());
    }

    public void setSystemTime(String systemTime) {
        this.systemTime = systemTime;
    }

    public String getNoProxy() {
        return noProxy;
    }

    public void setNoProxy(String noProxy) {
        this.noProxy = noProxy;
    }

    public String getArchitecture() {
        return architecture;
    }

    public void setArchitecture(String architecture) {
        this.architecture = architecture;
    }

    public Long getNeventsListener() {
        return neventsListener;
    }

    public void setNeventsListener(Long neventsListener) {
        this.neventsListener = neventsListener;
    }

    public String getHttpsProxy() {
        return httpsProxy;
    }

    public void setHttpsProxy(String httpsProxy) {
        this.httpsProxy = httpsProxy;
    }

    public Long getImages() {
        return images;
    }

    public void setImages(Long images) {
        this.images = images;
    }

    public Long getContainersRunning() {
        return containersRunning;
    }

    public void setContainersRunning(Long containersRunning) {
        this.containersRunning = containersRunning;
    }

    public List<String> getLabels() {
        return labels;
    }

    public void setLabels(List<String> labels) {
        this.labels = labels;
    }

    public InitCommit getInitCommit() {
        return initCommit;
    }

    public void setInitCommit(InitCommit initCommit) {
        this.initCommit = initCommit;
    }

    public Long getNfd() {
        return nfd;
    }

    public void setNfd(Long nfd) {
        this.nfd = nfd;
    }

    public String getKernelVersion() {
        return kernelVersion;
    }

    public void setKernelVersion(String kernelVersion) {
        this.kernelVersion = kernelVersion;
    }

    public String getLoggingDriver() {
        return loggingDriver;
    }

    public void setLoggingDriver(String loggingDriver) {
        this.loggingDriver = loggingDriver;
    }

    public List<DefaultAddressPool> getDefaultAddressPools() {
        return defaultAddressPools;
    }

    public void setDefaultAddressPools(List<DefaultAddressPool> defaultAddressPools) {
        this.defaultAddressPools = defaultAddressPools;
    }

    public String getOsType() {
        return osType;
    }

    public void setOsType(String osType) {
        this.osType = osType;
    }

    public List<String> getSecurityOptions() {
        return securityOptions;
    }

    public void setSecurityOptions(List<String> securityOptions) {
        this.securityOptions = securityOptions;
    }

    public ContainerdCommit getContainerdCommit() {
        return containerdCommit;
    }

    public void setContainerdCommit(ContainerdCommit containerdCommit) {
        this.containerdCommit = containerdCommit;
    }

    public List<GenericResource> getGenericResources() {
        return genericResources;
    }

    public void setGenericResources(List<GenericResource> genericResources) {
        this.genericResources = genericResources;
    }

    public Boolean getKernelMemory() {
        return kernelMemory;
    }

    public void setKernelMemory(Boolean kernelMemory) {
        this.kernelMemory = kernelMemory;
    }

    public String getOperatingSystem() {
        return operatingSystem;
    }

    public void setOperatingSystem(String operatingSystem) {
        this.operatingSystem = operatingSystem;
    }

    public RegistryConfig getRegistryConfig() {
        return registryConfig;
    }

    public void setRegistryConfig(RegistryConfig registryConfig) {
        this.registryConfig = registryConfig;
    }

    public String getServerVersion() {
        return serverVersion;
    }

    public void setServerVersion(String serverVersion) {
        this.serverVersion = serverVersion;
    }

    public Boolean getOomKillDisable() {
        return oomKillDisable;
    }

    public void setOomKillDisable(Boolean oomKillDisable) {
        this.oomKillDisable = oomKillDisable;
    }

    public Boolean getCpuCfsQuota() {
        return cpuCfsQuota;
    }

    public void setCpuCfsQuota(Boolean cpuCfsQuota) {
        this.cpuCfsQuota = cpuCfsQuota;
    }

    public Long getContainers() {
        return containers;
    }

    public void setContainers(Long containers) {
        this.containers = containers;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public Boolean getIpv4Forwarding() {
        return ipv4Forwarding;
    }

    public void setIpv4Forwarding(Boolean ipv4Forwarding) {
        this.ipv4Forwarding = ipv4Forwarding;
    }

    public Boolean getExperimentalBuild() {
        return experimentalBuild;
    }

    public void setExperimentalBuild(Boolean experimentalBuild) {
        this.experimentalBuild = experimentalBuild;
    }

    public String getProductLicense() {
        return productLicense;
    }

    public void setProductLicense(String productLicense) {
        this.productLicense = productLicense;
    }

    public String getClusterStore() {
        return clusterStore;
    }

    public void setClusterStore(String clusterStore) {
        this.clusterStore = clusterStore;
    }

    public String getDockerRootDir() {
        return dockerRootDir;
    }

    public void setDockerRootDir(String dockerRootDir) {
        this.dockerRootDir = dockerRootDir;
    }

    public Boolean getCpuSet() {
        return cpuSet;
    }

    public void setCpuSet(Boolean cpuSet) {
        this.cpuSet = cpuSet;
    }

    public Boolean getCpuCfsPeriod() {
        return cpuCfsPeriod;
    }

    public void setCpuCfsPeriod(Boolean cpuCfsPeriod) {
        this.cpuCfsPeriod = cpuCfsPeriod;
    }

    public String getDefaultRuntime() {
        return defaultRuntime;
    }

    public void setDefaultRuntime(String defaultRuntime) {
        this.defaultRuntime = defaultRuntime;
    }

    public String getClusterAdvertise() {
        return clusterAdvertise;
    }

    public void setClusterAdvertise(String clusterAdvertise) {
        this.clusterAdvertise = clusterAdvertise;
    }

    public Boolean getCpuShares() {
        return cpuShares;
    }

    public void setCpuShares(Boolean cpuShares) {
        this.cpuShares = cpuShares;
    }

    public Boolean getDebug() {
        return debug;
    }

    public void setDebug(Boolean debug) {
        this.debug = debug;
    }

    public Integer getNcpu() {
        return ncpu;
    }

    public void setNcpu(Integer ncpu) {
        this.ncpu = ncpu;
    }

    public Plugins getPlugins() {
        return plugins;
    }

    public void setPlugins(Plugins plugins) {
        this.plugins = plugins;
    }

    public Boolean getSwapLimit() {
        return swapLimit;
    }

    public void setSwapLimit(Boolean swapLimit) {
        this.swapLimit = swapLimit;
    }

    public String getCgroupDriver() {
        return cgroupDriver;
    }

    public void setCgroupDriver(String cgroupDriver) {
        this.cgroupDriver = cgroupDriver;
    }

    public Long getContainersPaused() {
        return containersPaused;
    }

    public void setContainersPaused(Long containersPaused) {
        this.containersPaused = containersPaused;
    }

    public Long getMemTotal() {
        return memTotal;
    }

    public void setMemTotal(Long memTotal) {
        this.memTotal = memTotal;
    }

    public String getIndexServerAddress() {
        return indexServerAddress;
    }

    public void setIndexServerAddress(String indexServerAddress) {
        this.indexServerAddress = indexServerAddress;
    }

    public Boolean getMemoryLimit() {
        return memoryLimit;
    }

    public void setMemoryLimit(Boolean memoryLimit) {
        this.memoryLimit = memoryLimit;
    }

    public String getHttpProxy() {
        return httpProxy;
    }

    public void setHttpProxy(String httpProxy) {
        this.httpProxy = httpProxy;
    }

    public String getInitBinary() {
        return initBinary;
    }

    public void setInitBinary(String initBinary) {
        this.initBinary = initBinary;
    }

    public String getCgroupVersion() {
        return cgroupVersion;
    }

    public void setCgroupVersion(String cgroupVersion) {
        this.cgroupVersion = cgroupVersion;
    }

    public Boolean getPidsLimit() {
        return pidsLimit;
    }

    public void setPidsLimit(Boolean pidsLimit) {
        this.pidsLimit = pidsLimit;
    }

    public String getIsolation() {
        return isolation;
    }

    public void setIsolation(String isolation) {
        this.isolation = isolation;
    }

    public Boolean getBridgeNfIp6tables() {
        return bridgeNfIp6tables;
    }

    public void setBridgeNfIp6tables(Boolean bridgeNfIp6tables) {
        this.bridgeNfIp6tables = bridgeNfIp6tables;
    }

    public List<String> getWarnings() {
        return warnings;
    }

    public void setWarnings(List<String> warnings) {
        this.warnings = warnings;
    }

    public Long getContainersStopped() {
        return containersStopped;
    }

    public void setContainersStopped(Long containersStopped) {
        this.containersStopped = containersStopped;
    }

    public static class Swarm {

        @JsonProperty("NodeAddr")
        private String nodeAddr;

        @JsonProperty("Managers")
        private Long managers;

        @JsonProperty("NodeID")
        private String nodeID;

        @JsonProperty("Error")
        private String error;

        @JsonProperty("Cluster")
        private Cluster cluster;

        @JsonProperty("ControlAvailable")
        private Boolean controlAvailable;

        @JsonProperty("LocalNodeState")
        private String localNodeState;

        @JsonProperty("Nodes")
        private Long nodes;

        @JsonProperty("RemoteManagers")
        private List<RemoteManager> remoteManagers;

        public String getNodeAddr() {
            return nodeAddr;
        }

        public void setNodeAddr(String nodeAddr) {
            this.nodeAddr = nodeAddr;
        }

        public Long getManagers() {
            return managers;
        }

        public void setManagers(Long managers) {
            this.managers = managers;
        }

        public String getNodeID() {
            return nodeID;
        }

        public void setNodeID(String nodeID) {
            this.nodeID = nodeID;
        }

        public String getError() {
            return error;
        }

        public void setError(String error) {
            this.error = error;
        }

        public Cluster getCluster() {
            return cluster;
        }

        public void setCluster(Cluster cluster) {
            this.cluster = cluster;
        }

        public Boolean getControlAvailable() {
            return controlAvailable;
        }

        public void setControlAvailable(Boolean controlAvailable) {
            this.controlAvailable = controlAvailable;
        }

        public String getLocalNodeState() {
            return localNodeState;
        }

        public void setLocalNodeState(String localNodeState) {
            this.localNodeState = localNodeState;
        }

        public Long getNodes() {
            return nodes;
        }

        public void setNodes(Long nodes) {
            this.nodes = nodes;
        }

        public List<RemoteManager> getRemoteManagers() {
            return remoteManagers;
        }

        public void setRemoteManagers(List<RemoteManager> remoteManagers) {
            this.remoteManagers = remoteManagers;
        }

        public static class RemoteManager {

            @JsonProperty("NodeID")
            private String nodeID;

            @JsonProperty("Addr")
            private String addr;

            public String getNodeID() {
                return nodeID;
            }

            public void setNodeID(String nodeID) {
                this.nodeID = nodeID;
            }

            public String getAddr() {
                return addr;
            }

            public void setAddr(String addr) {
                this.addr = addr;
            }
        }

        public static class Cluster {

            @JsonProperty("DefaultAddrPool")
            private String[][] defaultAddrPool;

            @JsonProperty("RootRotationInProgress")
            private Boolean rootRotationInProgress;

            @JsonProperty("SubnetSize")
            private Long subnetSize;

            @JsonProperty("Version")
            private Version version;

            @JsonProperty("CreatedAt")
            private String createdAt;

            @JsonProperty("TLSInfo")
            private TLSInfo tLSInfo;

            @JsonProperty("DataPathPort")
            private Long dataPathPort;

            @JsonProperty("ID")
            private String id;

            @JsonProperty("Spec")
            private Spec spec;

            @JsonProperty("UpdatedAt")
            private String updatedAt;

            public String[][] getDefaultAddrPool() {
                return defaultAddrPool;
            }

            public void setDefaultAddrPool(String[][] defaultAddrPool) {
                this.defaultAddrPool = defaultAddrPool;
            }

            public Boolean getRootRotationInProgress() {
                return rootRotationInProgress;
            }

            public void setRootRotationInProgress(Boolean rootRotationInProgress) {
                this.rootRotationInProgress = rootRotationInProgress;
            }

            public Long getSubnetSize() {
                return subnetSize;
            }

            public void setSubnetSize(Long subnetSize) {
                this.subnetSize = subnetSize;
            }

            public Version getVersion() {
                return version;
            }

            public void setVersion(Version version) {
                this.version = version;
            }

            public String getCreatedAt() {
                return createdAt;
            }

            public void setCreatedAt(String createdAt) {
                this.createdAt = createdAt;
            }

            public TLSInfo gettLSInfo() {
                return tLSInfo;
            }

            public void settLSInfo(TLSInfo tLSInfo) {
                this.tLSInfo = tLSInfo;
            }

            public Long getDataPathPort() {
                return dataPathPort;
            }

            public void setDataPathPort(Long dataPathPort) {
                this.dataPathPort = dataPathPort;
            }

            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public Spec getSpec() {
                return spec;
            }

            public void setSpec(Spec spec) {
                this.spec = spec;
            }

            public String getUpdatedAt() {
                return updatedAt;
            }

            public void setUpdatedAt(String updatedAt) {
                this.updatedAt = updatedAt;
            }

            public static class Version {

                @JsonProperty("Index")
                private Long index;

                public Long getIndex() {
                    return index;
                }

                public void setIndex(Long index) {
                    this.index = index;
                }
            }

            public static class Spec {

                @JsonProperty("Orchestration")
                private Orchestration orchestration;

                @JsonProperty("CAConfig")
                private CAConfig caConfig;

                @JsonProperty("Labels")
                private Map<String, String> labels;

                @JsonProperty("Raft")
                private Raft raft;

                @JsonProperty("Dispatcher")
                private Dispatcher dispatcher;

                @JsonProperty("TaskDefaults")
                private TaskDefaults taskDefaults;

                @JsonProperty("EncryptionConfig")
                private EncryptionConfig encryptionConfig;

                @JsonProperty("Name")
                private String name;

                public Orchestration getOrchestration() {
                    return orchestration;
                }

                public void setOrchestration(Orchestration orchestration) {
                    this.orchestration = orchestration;
                }

                public CAConfig getCaConfig() {
                    return caConfig;
                }

                public void setCaConfig(CAConfig caConfig) {
                    this.caConfig = caConfig;
                }

                public Map<String, String> getLabels() {
                    return labels;
                }

                public void setLabels(Map<String, String> labels) {
                    this.labels = labels;
                }

                public Raft getRaft() {
                    return raft;
                }

                public void setRaft(Raft raft) {
                    this.raft = raft;
                }

                public Dispatcher getDispatcher() {
                    return dispatcher;
                }

                public void setDispatcher(Dispatcher dispatcher) {
                    this.dispatcher = dispatcher;
                }

                public TaskDefaults getTaskDefaults() {
                    return taskDefaults;
                }

                public void setTaskDefaults(TaskDefaults taskDefaults) {
                    this.taskDefaults = taskDefaults;
                }

                public EncryptionConfig getEncryptionConfig() {
                    return encryptionConfig;
                }

                public void setEncryptionConfig(EncryptionConfig encryptionConfig) {
                    this.encryptionConfig = encryptionConfig;
                }

                public String getName() {
                    return name;
                }

                public void setName(String name) {
                    this.name = name;
                }

                public static class Orchestration {

                    @JsonProperty("TaskHistoryRetentionLimit")
                    private Long taskHistoryRetentionLimit;

                    public Long getTaskHistoryRetentionLimit() {
                        return taskHistoryRetentionLimit;
                    }

                    public void setTaskHistoryRetentionLimit(Long taskHistoryRetentionLimit) {
                        this.taskHistoryRetentionLimit = taskHistoryRetentionLimit;
                    }
                }

                public static class CAConfig {

                    @JsonProperty("SigningCACert")
                    private String signingCACert;

                    @JsonProperty("ExternalCAs")
                    private List<ExternalCA> externalCAs;

                    @JsonProperty("ForceRotate")
                    private Long forceRotate;

                    @JsonProperty("NodeCertExpiry")
                    private Long nodeCertExpiry;

                    @JsonProperty("SigningCAKey")
                    private String signingCAKey;

                    public String getSigningCACert() {
                        return signingCACert;
                    }

                    public void setSigningCACert(String signingCACert) {
                        this.signingCACert = signingCACert;
                    }

                    public List<ExternalCA> getExternalCAs() {
                        return externalCAs;
                    }

                    public void setExternalCAs(List<ExternalCA> externalCAs) {
                        this.externalCAs = externalCAs;
                    }

                    public Long getForceRotate() {
                        return forceRotate;
                    }

                    public void setForceRotate(Long forceRotate) {
                        this.forceRotate = forceRotate;
                    }

                    public Long getNodeCertExpiry() {
                        return nodeCertExpiry;
                    }

                    public void setNodeCertExpiry(Long nodeCertExpiry) {
                        this.nodeCertExpiry = nodeCertExpiry;
                    }

                    public String getSigningCAKey() {
                        return signingCAKey;
                    }

                    public void setSigningCAKey(String signingCAKey) {
                        this.signingCAKey = signingCAKey;
                    }

                    public static class ExternalCA {

                        @JsonProperty("Options")
                        private Map<String, String> options;

                        @JsonProperty("CACert")
                        private String caCert;

                        @JsonProperty("Protocol")
                        private String protocol;

                        @JsonProperty("URL")
                        private String url;

                        public Map<String, String> getOptions() {
                            return options;
                        }

                        public void setOptions(Map<String, String> options) {
                            this.options = options;
                        }

                        public String getCaCert() {
                            return caCert;
                        }

                        public void setCaCert(String caCert) {
                            this.caCert = caCert;
                        }

                        public String getProtocol() {
                            return protocol;
                        }

                        public void setProtocol(String protocol) {
                            this.protocol = protocol;
                        }

                        public String getUrl() {
                            return url;
                        }

                        public void setUrl(String url) {
                            this.url = url;
                        }
                    }
                }

                public static class Raft {

                    @JsonProperty("SnapshotInterval")
                    private Long snapshotInterval;

                    @JsonProperty("LogEntriesForSlowFollowers")
                    private Long logEntriesForSlowFollowers;

                    @JsonProperty("KeepOldSnapshots")
                    private Long keepOldSnapshots;

                    @JsonProperty("ElectionTick")
                    private Long electionTick;

                    @JsonProperty("HeartbeatTick")
                    private Long heartbeatTick;

                    public Long getSnapshotInterval() {
                        return snapshotInterval;
                    }

                    public void setSnapshotInterval(Long snapshotInterval) {
                        this.snapshotInterval = snapshotInterval;
                    }

                    public Long getLogEntriesForSlowFollowers() {
                        return logEntriesForSlowFollowers;
                    }

                    public void setLogEntriesForSlowFollowers(Long logEntriesForSlowFollowers) {
                        this.logEntriesForSlowFollowers = logEntriesForSlowFollowers;
                    }

                    public Long getKeepOldSnapshots() {
                        return keepOldSnapshots;
                    }

                    public void setKeepOldSnapshots(Long keepOldSnapshots) {
                        this.keepOldSnapshots = keepOldSnapshots;
                    }

                    public Long getElectionTick() {
                        return electionTick;
                    }

                    public void setElectionTick(Long electionTick) {
                        this.electionTick = electionTick;
                    }

                    public Long getHeartbeatTick() {
                        return heartbeatTick;
                    }

                    public void setHeartbeatTick(Long heartbeatTick) {
                        this.heartbeatTick = heartbeatTick;
                    }
                }

                public static class Dispatcher {

                    @JsonProperty("HeartbeatPeriod")
                    private Long heartbeatPeriod;

                    public Long getHeartbeatPeriod() {
                        return heartbeatPeriod;
                    }

                    public void setHeartbeatPeriod(Long heartbeatPeriod) {
                        this.heartbeatPeriod = heartbeatPeriod;
                    }
                }

                public static class TaskDefaults {

                    @JsonProperty("LogDriver")
                    private LogDriver logDriver;

                    public LogDriver getLogDriver() {
                        return logDriver;
                    }

                    public void setLogDriver(LogDriver logDriver) {
                        this.logDriver = logDriver;
                    }

                    public static class LogDriver {

                        @JsonProperty("Options")
                        private Map<String, String> options;

                        @JsonProperty("Name")
                        private String name;

                        public Map<String, String> getOptions() {
                            return options;
                        }

                        public void setOptions(Map<String, String> options) {
                            this.options = options;
                        }

                        public String getName() {
                            return name;
                        }

                        public void setName(String name) {
                            this.name = name;
                        }
                    }
                }

                public static class EncryptionConfig {

                    @JsonProperty("AutoLockManagers")
                    private Boolean autoLockManagers;

                    public Boolean getAutoLockManagers() {
                        return autoLockManagers;
                    }

                    public void setAutoLockManagers(Boolean autoLockManagers) {
                        this.autoLockManagers = autoLockManagers;
                    }
                }
            }

            public static class TLSInfo {

                @JsonProperty("TrustRoot")
                private String trustRoot;

                @JsonProperty("CertIssuerPublicKey")
                private String certIssuerPublicKey;

                @JsonProperty("CertIssuerSubject")
                private String certIssuerSubject;

                public String getTrustRoot() {
                    return trustRoot;
                }

                public void setTrustRoot(String trustRoot) {
                    this.trustRoot = trustRoot;
                }

                public String getCertIssuerPublicKey() {
                    return certIssuerPublicKey;
                }

                public void setCertIssuerPublicKey(String certIssuerPublicKey) {
                    this.certIssuerPublicKey = certIssuerPublicKey;
                }

                public String getCertIssuerSubject() {
                    return certIssuerSubject;
                }

                public void setCertIssuerSubject(String certIssuerSubject) {
                    this.certIssuerSubject = certIssuerSubject;
                }
            }
        }
    }

    public static class Runtimes {

        @JsonProperty("custom")
        private Custom custom;

        @JsonProperty("runc")
        private Runc runc;

        @JsonProperty("runc-master")
        private RuncMaster runcMaster;

        public Custom getCustom() {
            return custom;
        }

        public void setCustom(Custom custom) {
            this.custom = custom;
        }

        public Runc getRunc() {
            return runc;
        }

        public void setRunc(Runc runc) {
            this.runc = runc;
        }

        public RuncMaster getRuncMaster() {
            return runcMaster;
        }

        public void setRuncMaster(RuncMaster runcMaster) {
            this.runcMaster = runcMaster;
        }

        public static class Custom {

            @JsonProperty("runtimeArgs")
            private List<String> runtimeArgs;

            @JsonProperty("path")
            private String path;

            public List<String> getRuntimeArgs() {
                return runtimeArgs;
            }

            public void setRuntimeArgs(List<String> runtimeArgs) {
                this.runtimeArgs = runtimeArgs;
            }

            public String getPath() {
                return path;
            }

            public void setPath(String path) {
                this.path = path;
            }
        }

        public static class Runc {

            @JsonProperty("path")
            private String path;

            public String getPath() {
                return path;
            }

            public void setPath(String path) {
                this.path = path;
            }
        }

        public static class RuncMaster {

            @JsonProperty("path")
            private String path;

            public String getPath() {
                return path;
            }

            public void setPath(String path) {
                this.path = path;
            }
        }
    }

    public static class InitCommit {

        @JsonProperty("Expected")
        private String expected;

        @JsonProperty("ID")
        private String id;

        public String getExpected() {
            return expected;
        }

        public void setExpected(String expected) {
            this.expected = expected;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }

    public static class DefaultAddressPool {

        @JsonProperty("Size")
        private String size;

        @JsonProperty("Base")
        private String base;

        public String getSize() {
            return size;
        }

        public void setSize(String size) {
            this.size = size;
        }

        public String getBase() {
            return base;
        }

        public void setBase(String base) {
            this.base = base;
        }
    }

    public static class ContainerdCommit {

        @JsonProperty("Expected")
        private String expected;

        @JsonProperty("ID")
        private String id;

        public String getExpected() {
            return expected;
        }

        public void setExpected(String expected) {
            this.expected = expected;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }

    public static class RegistryConfig {

        @JsonProperty("AllowNondistributableArtifactsCIDRs")
        private List<String> allowNondistributableArtifactsCIDRs;

        @JsonProperty("AllowNondistributableArtifactsHostnames")
        private List<String> allowNondistributableArtifactsHostnames;

        @JsonProperty("InsecureRegistryCIDRs")
        private List<String> insecureRegistryCIDRs;

        @JsonProperty("IndexConfigs")
        private Map<String, IndexConfig> indexConfigs;

        @JsonProperty("Mirrors")
        private List<String> mirrors;

        public List<String> getAllowNondistributableArtifactsCIDRs() {
            return allowNondistributableArtifactsCIDRs;
        }

        public void setAllowNondistributableArtifactsCIDRs(List<String> allowNondistributableArtifactsCIDRs) {
            this.allowNondistributableArtifactsCIDRs = allowNondistributableArtifactsCIDRs;
        }

        public List<String> getAllowNondistributableArtifactsHostnames() {
            return allowNondistributableArtifactsHostnames;
        }

        public void setAllowNondistributableArtifactsHostnames(List<String> allowNondistributableArtifactsHostnames) {
            this.allowNondistributableArtifactsHostnames = allowNondistributableArtifactsHostnames;
        }

        public List<String> getInsecureRegistryCIDRs() {
            return insecureRegistryCIDRs;
        }

        public void setInsecureRegistryCIDRs(List<String> insecureRegistryCIDRs) {
            this.insecureRegistryCIDRs = insecureRegistryCIDRs;
        }

        public Map<String, IndexConfig> getIndexConfigs() {
            return indexConfigs;
        }

        public void setIndexConfigs(Map<String, IndexConfig> indexConfigs) {
            this.indexConfigs = indexConfigs;
        }

        public List<String> getMirrors() {
            return mirrors;
        }

        public void setMirrors(List<String> mirrors) {
            this.mirrors = mirrors;
        }

        public static class IndexConfig {

            @JsonProperty("Secure")
            private Boolean secure;

            @JsonProperty("Official")
            private Boolean official;

            @JsonProperty("Mirrors")
            private List<String> mirrors;

            @JsonProperty("Name")
            private String name;

            public Boolean getSecure() {
                return secure;
            }

            public void setSecure(Boolean secure) {
                this.secure = secure;
            }

            public Boolean getOfficial() {
                return official;
            }

            public void setOfficial(Boolean official) {
                this.official = official;
            }

            public List<String> getMirrors() {
                return mirrors;
            }

            public void setMirrors(List<String> mirrors) {
                this.mirrors = mirrors;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }
    }

    public static class Plugins {

        @JsonProperty("Authorization")
        private List<String> authorization;

        @JsonProperty("Volume")
        private List<String> volume;

        @JsonProperty("Log")
        private List<String> log;

        @JsonProperty("Network")
        private List<String> network;

        public List<String> getAuthorization() {
            return authorization;
        }

        public void setAuthorization(List<String> authorization) {
            this.authorization = authorization;
        }

        public List<String> getVolume() {
            return volume;
        }

        public void setVolume(List<String> volume) {
            this.volume = volume;
        }

        public List<String> getLog() {
            return log;
        }

        public void setLog(List<String> log) {
            this.log = log;
        }

        public List<String> getNetwork() {
            return network;
        }

        public void setNetwork(List<String> network) {
            this.network = network;
        }
    }

    public static class RuncCommit {

        @JsonProperty("Expected")
        private String expected;

        @JsonProperty("ID")
        private String id;

        public String getExpected() {
            return expected;
        }

        public void setExpected(String expected) {
            this.expected = expected;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }

    public static class GenericResource {

        @JsonProperty("NamedResourceSpec")
        private NamedResourceSpec namedResourceSpec;

        @JsonProperty("DiscreteResourceSpec")
        private DiscreteResourceSpec discreteResourceSpec;

        public NamedResourceSpec getNamedResourceSpec() {
            return namedResourceSpec;
        }

        public void setNamedResourceSpec(NamedResourceSpec namedResourceSpec) {
            this.namedResourceSpec = namedResourceSpec;
        }

        public DiscreteResourceSpec getDiscreteResourceSpec() {
            return discreteResourceSpec;
        }

        public void setDiscreteResourceSpec(DiscreteResourceSpec discreteResourceSpec) {
            this.discreteResourceSpec = discreteResourceSpec;
        }

        public static class NamedResourceSpec {

            @JsonProperty("Kind")
            private String kind;

            @JsonProperty("Value")
            private String value;

            public String getKind() {
                return kind;
            }

            public void setKind(String kind) {
                this.kind = kind;
            }

            public String getValue() {
                return value;
            }

            public void setValue(String value) {
                this.value = value;
            }
        }

        public static class DiscreteResourceSpec {

            @JsonProperty("Kind")
            private String kind;

            @JsonProperty("Value")
            private Long value;

            public String getKind() {
                return kind;
            }

            public void setKind(String kind) {
                this.kind = kind;
            }

            public Long getValue() {
                return value;
            }

            public void setValue(Long value) {
                this.value = value;
            }
        }
    }
}